1.0			[Dead listing et patching]
			^^^^^^^^^^^^^^^^^^^^^^^^^^

Ce texte fait partie du tutorial de TiTi. Soyez sr d'avoir lu les fichiers "introduction", "ASM et cRaCKiNg" et "trouver le bon numro de srie" avant de commencer ce fichier.

Prliminaires
^^^^^^^^^^^^^

* Commencez par installer Wdasm32. Ensuite, faites une copie de sauvegarde du fichier Winzip32.exe (Winzip32.bak) et une copie que vous allez ouvrir avec W32Dasm (Winzip32.w32). Maintenant, lancez W32Dasm, et ouvrez Winzip32.w32. Le proccessus de dsssemblage commence.

* Le but n'est plus cette fois de trouver le bon numro de srie, mais de patcher Winzip. Il y a diffrents endroits ou le patcher. On peut tout d'abord "enlever" toutes les limitations, c'est  dire supprimer l'appel au nag screen, et la mention "Unregistered" dans la barre de titre. On peut aussi patcher Winzip afin qu'il accepte tout code entr. C'est comme ca que nous allons procder. Il y a, bien sr d'autres mthodes.

Allons-y !!
^^^^^^^^^^^

* Allez, comme tout  l'heure, dans Help / about et appuyez sur "r". Vous voyez apparatre la boite de dialogue qui permet d'entrer le nom et le serial. Entrez votre nom (ex: TiTi), puis un serial bidon (123465789). Vous voyez s'afficher  l'cran un message d'erreur : "Incomplete or incorrect information". Nous avons donc un premier point de repre. Il faudrait trouver dans le listing dsassembl de Winzip l'appel  l'affichage de ce message, on saurait alors que le branchement conditionnel qui nous envoie sur le message est situ peu avant. Et c'est justement ce que permet de faire Wdasm32 ! Cliquez sur Refs / string data rferences. Vous voyez apparaitre une fentre avec tous les petits bouts de textes suceptibles d'tre affichs par Winzip. Cliquez sur "copy all" et ouvrez un nouveau document texte. Tapez Ctrl-V pour coller, et le contenu de la fentre prcdente est colle. Cliquez sur "recherchez" dans le notepad et tapez "Incomplete or incorrect information". Le notepad vous envoie sur la ligne :
 String Resource ID=00654: "Incomplete or incorrect information"
Vous savez maintenant ou se situe ce message dans la fentre des "data string references" (DSR). Nous avons utilis le notepad afin de pallier au manque de fonction de recherche dans la fentre des DSR. Allez  la ligne "String resource ID=00654" dans la fentre de DSR. Double cliquez dessus. Vous arrivez la :

* Reference To: USER32.GetDlgItemTextA, Ord:00F5h
                                  |
:00409D6D  Call dword ptr [00476AC8]		<-- Tout  l'heure, avec softice, on tait arriv l
:00409D73  movzx eax, byte ptr [00471258]	|
:00409D7A  test eax, eax			| On vrifie que
:00409D7C  je 00409D92				| le serial et le nom
:00409D7E  movzx eax, byte ptr [0046F578]	| ne sont pas vides
:00409D85  test eax, eax			|
:00409D87  je 00409D92				| Si c'est le cas, on va en 409D92
:00409D89  call 004096EA			<-- Ca, c'est la routine de vrification du serial. Ca pourrait tre trs intressant de la patcher, mais ce n'est pas l'objet de ce cours.
:00409D8E  test eax, eax
:00409D90  jne 00409DD3				| Ici, on veut qu'il saute, sinon on arrive l o il ne faut pas

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00409D7C(C), :00409D87(C)
|
:00409D92  call 00409F9C

* Possible Reference to String Resource ID=00654: "Incomplete or incorrect information"
           |                       
:00409D97  push 0000028E			<-- 28Eh = 654d :)
:00409D9C  call 00424ECF			<-- C'est ici que s'affiche le message
:00409DA1  pop ecx
:00409DA2  push eax

* Bon, comment patcher tout cela ? 1. Il ne faut pas qu'il saute en 409D92 quand il est en 409D7C. 2. Il ne faut pas non plus qu'il saute en 409D92 quand il est en 409D87. 3. Il faut qu'il saute quand il est en 409D90 afin de ne pas arriver en 409D92.

* On pourrait donc patcher les deux "je 00409D92" en "nops", et changer le jne 00409DD3 en jmp 00409DD3. Mhh oui, mais c'est un peu long : il suffirait de patcher le premier je 00409D92 en jmp 00409DD3, non ?

* Quittez donc Winzip et double cliquez sur le ":00409D7C 7414 je 00409D92" puique c'est la que nous allons patcher. En bas de la fentre de W32Dasm, on voit : "@Offset 0000917Ch in Winzip32.w32" C'es l'adresse o se trouve le "je 00409D92" dans le fichier executable de Winzip. Allez sous DOS, dans le rpertoire de Winzip, et tapez : "Hiew Winzip32.exe" pour lancer Hacker's view. Appuyez sur [F4], puis sur [F3]. Vous aurrez une vue en dsassemblage. Tapez maintenant [F5] et entrez 917C. On arrive pile sur le je. Appuyez sur [F3] pour passer en mode Edit. On voit que notre "jne 409DD3" s'appelle maintenant "jne 91D3". On va donc patcher le "jne 9192" sur lequel notre [F5] nous a envoy en "jmp 91D3". Appuyez sur [F2] effacez ce que vous voyez, et tapez : "jmps 91D3". Au niveau hexadecimal, vous modifiez "7414" en "EB55". Appuyez sur [F9] pour sauvegarder les changements, et quittez Hview. Relancez Winzip, et entrez un Nom, et un numro de srie. Il l'accepte ? C'est gagn ! Voil, sachez que beaucoup de jeux, (quake 2, Unreal) peuvent tre craqus en 2 minutes de cette manire, car ils envoient une boite de dialogue demandant d'insrer le CD.

* Quittez Winzip et relancez le. Argghhh ! Il y toujours le nag screen, mais pourquoi ? Winzip a enregistr les informations que nous lui avons donnes dans le fichier Win.ini Il relit ensuite celui-ci  chaque dmarrage et vrifie que name et serial sont corrects... Par contre, le "Unregistered" est, lui bien parti.

* Nous allons essayer de reprer dans le listing, l'endroit ou Winzip affiche ce nag screen. En bas de celui-ci, il a un bouton "I agree" dont la place est alatoire. Cherchons "I agree" dans les DSR. On trouve "I &Agree" et "I agr&ee". Qui sont les deux types de boutons. Le "&" spcifie la lettre qui sera souligne et qui servira de racourci Windows.

* Il nous faut trouver LE saut conditionnel qui met Winzip en tat unregistered, ou non. Prs de ce saut, on doit certainement trouver un truc du genre mov byte ptr [xxx],1 qui Initialise une variable "drapeau"  1, qui permmettra  Winzip de vrifier qu'il est enregistr ultrieurement.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403627(U)
|
:0040363B 0FB705DCC04600          movzx eax, word ptr [0046C0DC]
:00403642 A3A82A4600              mov dword ptr [00462AA8], eax
:00403647 0FB705E4C04600          movzx eax, word ptr [0046C0E4]
:0040364E A3AC2A4600              mov dword ptr [00462AAC], eax
:00403653 8B45E0                  mov eax, dword ptr [ebp-20]
:00403656 83E002                  and eax, 00000002
:00403659 85C0                    test eax, eax
:0040365B 7425                    je 00403682
:0040365D 68F8C04600              push 0046C0F8

* Possible StringData Ref from Data Obj ->"I &Agree"
                                  |
:00403662 68B82A4600              push 00462AB8
:00403667 E8BF020000              call 0040392B

* D'aprs ce listing, on voit que cette routine  t appele depuis l'adresse 00403627 par un saut inconditionnel jmp (U = unconditional). Allons dans goto / code location et tapons : "403627". Nous arrivons  une procdure qui est vraissemblablement au nag. (LoadIcon , GetWindowRec). Cette procdure a elle meme t appele par un "Call" en 4032D4. Allons  cette adresse. En remontant ainside proche en proche, on finit par arriver en 004029F0. Et nous y voyons : 

:004029E9  call 004096EA				<-- La routine de vrification du serial (tjrs la meme :)
:004029EE  test eax, eax				<-- Eax est gal  0 ?
:004029F0  je 004029FE					<-- Vilain garon	
:004029F2  mov dword ptr [00471C58], 00000001		<-- Le drapeau
:004029FC  jmp 00402A0B					<-- Gentil garon

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004029F0(C)
|
:004029FE  call 0040300F

* Une mthode "moins bourrin" pour arriver ici, consiterait  aller  la routine de vrification du serial (en 004096EA), dont nous connaissons l'adresse depuis la premire tape, et de voir d'o elle est appele. D'ailleurs, la meilleure mthode est de patcher cette routine directement, une bonne fois pour toute pour qu'elle ne retourne jamais "0". Mais vous tes la pour apprendre, non ? Pourquoi faire simple quand on peut faire compliqu ;)

* Bon, maintenant qu'on y est, il suffit d'viter que le je 004029FE se fasse. On peut bien sur le patcher avec deux "nop". Personnellement, je prfre patcher le test eax, eax en "Inc eax" (j'ai l'esprit un peu tortur ;) Le zero flag ne sera ainsi jamais pos, et le saut en 004029FE ne se fera jamais.

* Lancez hacker's view, passez en mode "decode" ([F3], [F4]) Allez en "1DEE" voir en bas de la fentre de Wdasm32 quand test eax, eax est slectionn. Passez en mode edit ([F3]) puis en mode asm ([F2]) Remplacez "test eax, eax" en "inc eax". Le 85h va devenir 40h, mais inc eax ne prend qu'un octet. Le C0 reste donc  patcher, on le patche en "NOP" (90h). Au final, "80C0h" devient "4090h". Enregistrez les modifications avec [F9], et quittez Hacker's View.

* Relancez Winzip, et... c'est bon ;) Il est enregistr ! Merci TiTi ! Essayez de vous faire la main en patchant directement la routine de vrification (004096EA) !

Au final, on a modifi comme ca :

00001DEE: 40 85
00001DEF: 90 C0
0000917C: EB 74
0000917D: 55 14

Voil, j'espre que ce tutorial vous aura appris quelque chose, envoyez moi vos suggestions / commentaires etc  TiTi_1st@hotmail.com

		- TiTi